package cn.itcast.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author StormArcita
 * @date 2024-12-9 13:38
 */
public class ProxyFactory<T> {

    //目标对象，具体调用什么由调用者决定
    private T target;

    public ProxyFactory(T target) {
        this.target = target;
    }

    public T getProxy(){
        //1。获取目标对象的类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //2.获取目标对象所实现的所有接口
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //1.JDK动态代理方式
        //newProxyInstance(类加载器, 接口对象, InvocationHandler的实现类)
        //因为代理对象必须要创建在目标对象之后，所以传入的类加载器是目标对象的类加载器，如果可以拿到目标对象的类加载器就说明目标对象已经创建完成
        T t = (T)Proxy.newProxyInstance(classLoader, interfaces, new MyInvocationHandler());
        return t;
    }

    public class MyInvocationHandler implements InvocationHandler {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //日志前置操作
            System.out.println("日志功能：方法执行了，参数为"+method.getName()+","+ Arrays.toString(args).toString());
            Object result = method.invoke(target, args);
            //日志后置操作
            System.out.println("日志执行完成：结果为"+result);
            return result;
        }
    }
}
